package cn.edu.scau.cmi.ema.service;

import java.util.List;
import java.util.Set;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;


import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.Session;
import cn.edu.scau.cmi.ema.dao.*;
import cn.edu.scau.cmi.ema.domain.*;
import cn.edu.scau.cmi.ema.util.CmiSqlUtil;
import cn.edu.scau.cmi.ema.domain.base.CmiPagination;
import cn.edu.scau.cmi.ema.service.base.CmiEmaService;

import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import javax.persistence.Query;
import java.util.Iterator;
@Service("EventadulterlinkService")
@Transactional

public class EventadulterlinkServiceImpl extends CmiEmaService implements EventadulterlinkService {
	public EventadulterlinkServiceImpl() {
	}

	@Transactional
	public Eventadulterlink saveEventadulterlink(Eventadulterlink eventadulterlink) {

		if (eventadulterlink.getId() == null) {
			Adulterlink adulterlink = adulterlinkDAO.findAdulterlinkById(eventadulterlink.getAdulterlink().getId());
			Event event = eventDAO.findEventById(eventadulterlink.getEvent().getId());

			Eventadulterlink existingEventadulterlink = eventadulterlinkDAO
					.findEventadulterlinkByPhysicalPrimaryKey(event.getId(), adulterlink.getId());

			eventadulterlink.setAdulterlink(adulterlink);
			eventadulterlink.setEvent(event);

			if (isEquals(eventadulterlink, existingEventadulterlink)) {
				return existingEventadulterlink;
			}

			eventadulterlink = eventadulterlinkDAO.store(eventadulterlink);
			eventadulterlinkDAO.flush();

		} else {
			Eventadulterlink existingEventadulterlink = eventadulterlinkDAO
					.findEventadulterlinkByPrimaryKey(eventadulterlink.getId());

			eventadulterlink = eventadulterlinkDAO.store(eventadulterlink);
			eventadulterlinkDAO.flush();
		}

		return eventadulterlink;
	}

	public void deleteEventadulterlink(Eventadulterlink eventadulterlink) {
		eventadulterlinkDAO.remove(eventadulterlink);
		eventadulterlinkDAO.flush();
	}

	@Transactional
	public void deleteEventadulterlinks(Set<Integer> deleteEventadulterlinksId) {
		Query query = eventadulterlinkDAO.createNamedQuery("deleteEventadulterlinksById", -1, -1);
		query.setParameter(1, deleteEventadulterlinksId);
		query.executeUpdate();
	}

	@Transactional
	public Set<Eventadulterlink> loadEventadulterlinks() {
		return eventadulterlinkDAO.findAllEventadulterlinks();

	}

	@Transactional
	public Set<Eventadulterlink> loadReferenceEventadulterlinks(Set<Eventadulterlink> eventadulterlinks) {
		Iterator<Eventadulterlink> eventadulterlinksIterator = eventadulterlinks.iterator();
		Set<Eventadulterlink> referencedEventadulterlinks = new HashSet<>();
		while (eventadulterlinksIterator.hasNext()) {
			Eventadulterlink currentEventadulterlink = eventadulterlinksIterator.next();

		}
		return referencedEventadulterlinks;
	}

	public Set<Eventadulterlink> loadEventadulterlinksByIdSet(Set<Integer> eventadulterlinkIdSet) {

		Iterator<Integer> eventadulterlinkIdIterator = eventadulterlinkIdSet.iterator();
		Set<Eventadulterlink> eventadulterlinkSet = new HashSet<>();
		while (eventadulterlinkIdIterator.hasNext()) {
			Integer id = eventadulterlinkIdIterator.next();
			Eventadulterlink currentEventadulterlink = eventadulterlinkDAO.findEventadulterlinkById(id);
			eventadulterlinkSet.add(currentEventadulterlink);
		}
		return eventadulterlinkSet;
	}

	@Transactional
	public List<Eventadulterlink> findAllEventadulterlinks(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<Eventadulterlink>(
				eventadulterlinkDAO.findAllEventadulterlinks(startResult, maxRows));
	}

	@Transactional
	public Eventadulterlink findEventadulterlinkByPrimaryKey(Integer id) {
		return eventadulterlinkDAO.findEventadulterlinkByPrimaryKey(id);
	}

	@Transactional
	public Integer countEventadulterlinks() {
		return ((Long) eventadulterlinkDAO.createQuerySingleResult("select count(o) from Eventadulterlink o")
				.getSingleResult()).intValue();
	}

	@Transactional
	public Integer countEventadulterlinks(CmiPagination page) {
		String sql = CmiSqlUtil.createCountHql(page, Eventadulterlink.class);
		return ((Long) eventadulterlinkDAO.createQuerySingleResult(sql).getSingleResult()).intValue();
	}

	/**
	 * search for name with ajax
	 * 
	 */
	@Transactional
	public Integer countEventadulterlinksByName(String queryName) {
		Query query = eventadulterlinkDAO.createNamedQuery("countEventadulterlinksByName", -1, -1);
		query.setParameter(1, queryName);
		return new Long((long) query.getSingleResult()).intValue();
	}

	@Transactional
	public Integer countEventadulterlinksByDetachedCriteria(CmiPagination page) {
		DetachedCriteria detachedCriteria = CmiSqlUtil.createDetachedCriteria(page, Eventadulterlink.class);
		Session session = entityManager.unwrap(Session.class);
		detachedCriteria.setProjection(Projections.rowCount());
		return new Long((long) detachedCriteria.getExecutableCriteria(session).uniqueResult()).intValue();
	}

	public Map<String, ?> loadEventadulterlinkObjectReferencedSet(Eventadulterlink eventadulterlink) {
		HashMap<String, Object> objectReferencedSetMap = new HashMap<>();
		if (eventadulterlink.getAdulterlink() != null) {

			Set<Integer> adulterlinkIds = new HashSet<Integer>();
			adulterlinkIds.add(eventadulterlink.getAdulterlink().getId());
			objectReferencedSetMap.put("adulterlinkIds", adulterlinkIds);
		}
		if (eventadulterlink.getEvent() != null) {

			Set<Integer> eventIds = new HashSet<Integer>();
			eventIds.add(eventadulterlink.getEvent().getId());
			objectReferencedSetMap.put("eventIds", eventIds);
		}

		return objectReferencedSetMap;
	}

	public Map<String, ?> loadEventadulterlinkClassReferencedSet(Eventadulterlink eventadulterlink) {
		HashMap<String, Object> classReferencedSetMap = new HashMap<>();
		classReferencedSetMap.put("adulterlinks", adulterlinkDAO.findAllAdulterlinks());
		classReferencedSetMap.put("events", eventDAO.findAllEvents());

		return classReferencedSetMap;
	}

	public boolean isEquals(Eventadulterlink eventadulterlink, Object obj) {
		if (obj == eventadulterlink)
			return true;
		if (!(obj instanceof Eventadulterlink))
			return false;
		Eventadulterlink comparedEventadulterlink = (Eventadulterlink) obj;
		if (!CheckPropertyEqual(eventadulterlink.getEvent().getId(), comparedEventadulterlink.getEvent().getId())) {
			return false;
		}
		if (!CheckPropertyEqual(eventadulterlink.getAdulterlink().getId(),
				comparedEventadulterlink.getAdulterlink().getId())) {
			return false;
		}
		return true;
	}

	public static <T> boolean CheckPropertyEqual(T originProperty, T comparedProperty) {
		// 基本类型经过参数传递后会自动装箱
		String[] className = originProperty.getClass().getName().split("\\.");
		if (className[0].equals("java") && className[1].equals("math")) {
			return ((Comparable) originProperty).compareTo(comparedProperty) == 0 ? true : false;
		} else {
			return originProperty.equals(comparedProperty);
		}
	}
}

